#include "speedUp.h"
#include "C_code_Log.h"
#include "control.h"

uint8_t Speed_commonMethod(uint16_t speed) {
  static uint8_t flag = 0;
  flag++;
    LOG("INFO", "Speed_commonMethod,speed:%d",speed);
  if (flag > 5) {
    flag = 0;
    return 1;
  }
  return 0;
}

/// @brief 加速任务回调函数
/// @param control 控制台
/// @note 在完成加速任务后调用，若路障状态为退出，则将加速任务状态设置为完成，将寻找节点任务状态置为准备就绪
/// @note 若路障状态为阻塞，则将加速任务状态设置为阻塞，将路障状态置为准备就绪，为路障后的加速任务做准备
static void speedUpCallback(ControlCenterTypeDef *control) {
    if(control->runState->F_RoadBlockState == MY_EXIT)
    {
        control->runState->speedUpState = MY_EXIT;
        control->runState->seekNodeState = MY_READY;
    }
    else if(control->runState->F_RoadBlockState == MY_BLOCKED)
    {
        control->runState->speedUpState = MY_BLOCKED;
        control->runState->F_RoadBlockState = MY_READY;
    }
} 

/// @brief  加速任务处理函数
/// @param control 控制台
/// @note 在加速任务状态为准备就绪时调用，根据加速任务的类型执行不同的加速任务
/// @note 加速的参数分为两个，一个是路障前的加速参数，一个是路障后的加速参数，通过路障状态来判断调用哪个
/// @note 加速任务完成后调用加速任务回调函数
void speedUpHandle_Task(ControlCenterTypeDef *control) {
  // 如果加速任务状态为准备就绪 并且 路障状态为退出，执行路障后的加速任务
  if (control->runState->speedUpState == MY_READY&&control->runState->F_RoadBlockState == MY_EXIT) {
    // 根据加速任务的类型执行不同的加速任务，sectionInfo是当前路段的信息的指针，指向地图
    switch (control->sectionInfo->speedUpWay) {
      case FREE:
        speedUpCallback(control);
        break;
      case COMMON_SPEED:
        if (1 == Speed_commonMethod(control->sectionInfo->speedUpParam_After)) {
          speedUpCallback(control);
        }
        break;
      default:
        break;
    }
  }
  // 如果加速任务状态为准备就绪 并且 路障状态为阻塞，执行路障前的加速任务
  else if(control->runState->speedUpState == MY_READY && control->runState->F_RoadBlockState == MY_BLOCKED)
  {
    switch (control->sectionInfo->speedUpWay) {
      case FREE:
        speedUpCallback(control);
        break;
      case COMMON_SPEED:
        if (1 == Speed_commonMethod(control->sectionInfo->speedUpParam_Before)) {
          speedUpCallback(control);
        }
        break;
      default:speedUpCallback(control);
        break;
    }
  }
}